package com.gitee.chili.leisure.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 初始化 netty 参数，使用配置文件的方式
 *
 * @author week solider
 * @since 2020-07-21
 */

@Data
@Component
@ConfigurationProperties("netty.initialize")
public class InitializeNettyProperties {

    /** 端口号 */
    private int port;

    /**
     *  SO_BACKLOG 对应的是TCP/IP协议listen函数中的backlog参数，函数listen(int socketfd, int backlog)用来初始化服务端可连
     *  接队列，服务端处理客户端链接是顺序处理的，所以同一时间只能处理一个链接，多客户端请求过来时，服务端会将未处理的请求放入
     *  请求队列，backlog 就是制定了队列的大小。
     */
    private int backlog = 1024;

    /**
     * 参数表示允许重复使用本地地址和端口
     * 例如： 某个服务占用了TCP的8080端口，其他服务再对这个端口进行监听就会报错
     * 如果某个进程非正常退出，对一个端口的占用可能不会立即释放，这时候如果不设置这个参数，其他进程就不能立即使用这个端口
     */
    private boolean reuseaddr = true;

    /**
     * 当设置这个参数为TRUE后，tcp链接会测试这个链接的状态，如果该链接长时间没有数据交流，tcp会自动发送一个活动探测数据报文，
     * 来检测链接是否存活
     */
    private boolean keepalive = true;

    /**
     * 该参数的使用和Nagle算法有关，Nagle算法是将小的数据包组装为更大的帧进行发送，而不会来一个数据包发送一次，目的是为了提高
     * 每次发送的效率，因此在数据包没有组成足够大的帧时，就会延迟该数据包的发送，虽然提高了网络负载却造成了延时，TCP_NODELAY
     * 参数设置为true，就可以禁用Nagle算法，即使用小数据包即时传输。与TCP_NODELAY对应的就是TCP_CORK，该选项会等到发送的数据
     * 量最大的时候，一次性发送，适合进行文件传输
     */
    private boolean nodeLay = true;

    /** 发送缓冲区大小 */
    private int sndBuf = 10485760;

    /** 接收缓冲区大小 */
    private int rcvBuf = 10485760;

    /**
     * 通信消息的最大长度 (1024 * 64)
     *
     * 为什么会有最大长度?
     * 解决粘包的问题.
     *
     * 什么是粘包?
     * 通俗来讲(建立在socket连接上), 发送方发送消息可以是1k、1k的发送消息, 与此同时接收方也可以2k、2k的接收消息, 当发送的消
     * 息段为1k, 发送了两次, 代表是两个消息, 而接收方接收消息为2k, 接收了一次, 这时的消息就出现了粘包.
     * 所谓粘包问题主要还是因为接收方不知道消息之间的界限，不知道一次性提取多少字节的数据所造成的。
     */
    private int maxContentLength = 65536;

    /** netty连接根目录地址 */
    private String socketPath = "/leisure";
}
